package kahuuFotos.servicios;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import kahuuFotos.DTO.ListaFotos;
import kahuuFotos.mundo.KahuuException;
import kahuuFotos.mundo.ManejadorFotos;


import com.google.gson.Gson;
import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;

/**
 * 
 * @author gustavolozano
 *
 */
@Path("/fotos")
public class Fotos
{	
	//------------------------------------------------------------------------------------
	// Atributos
	//------------------------------------------------------------------------------------

	private ManejadorFotos manejador;

	//------------------------------------------------------------------------------------
	// Contructor
	//------------------------------------------------------------------------------------

	public Fotos()
	{
		manejador = ManejadorFotos.getInstance();
	}

	//------------------------------------------------------------------------------------
	// Metodos
	//------------------------------------------------------------------------------------

	@GET
	@Path("/similares")
	public String darFotoSimilar(@DefaultValue("") @QueryParam("ancho") String ancho)
	{	 

		Gson gson = new Gson();

		//Obtiene el nombre del archivo dependiendo si se digita
		ListaFotos similar = manejador.darFotoMasSimilar(Integer.parseInt(ancho));
		return gson.toJson(similar);

	}

	@POST
	@Consumes(MediaType.MULTIPART_FORM_DATA)
	@Produces(MediaType.TEXT_PLAIN)
	public String agregarFoto( @DefaultValue("") @FormDataParam("nombre") String nombre, 
			@DefaultValue("")  @FormDataParam("comentarios") String comentarios, 
			@DefaultValue("") @FormDataParam("posicion") String posicion,
			@DefaultValue("") @FormDataParam("fileName") String nombreFile,
			@FormDataParam("file") InputStream uploadedInputStream,
			@FormDataParam("file") FormDataContentDisposition fileDetail)
	{
		try 
		{
			//Obtiene el nombre del archivo dependiendo si se digito
			String fileName = fileDetail.getFileName();
			if(!nombreFile.equals(""))
			{
				fileName = nombreFile;
			}

			String replace = fileName.substring(fileName.lastIndexOf("."));
			String fileReplace =  fileName.replaceAll(replace, manejador.darNumero()+ replace);

			File file = writeToFile( uploadedInputStream, ManejadorFotos.GUARDAR +"/imagenes/kahuuFotos/"+ fileReplace);

			manejador.agregarFoto(nombre, comentarios, posicion, file);	

			return "SUCCESS";
		} 
		catch (KahuuException e)
		{
			return "ERROR:"+ e.getMessage();
		}
	}

	@GET
	public String darFotosPosicion(@QueryParam("posicion") String posicion)
	{
		ListaFotos lista = manejador.darFotosCerca(posicion);

		Gson gson = new Gson();
		return gson.toJson(lista);
	}

	//------------------------------------------------------------------------------------
	// Metodos Privados
	//------------------------------------------------------------------------------------

	private File writeToFile(InputStream uploadedInputStream, String uploadedFileLocation) throws KahuuException
	{

		try
		{
			File f = new File( uploadedFileLocation  );

			OutputStream out = new FileOutputStream(f);
			int read = 0;
			byte[] bytes = new byte[1024];

			while ((read = uploadedInputStream.read(bytes)) != -1) 
			{
				out.write(bytes, 0, read);
			}
			out.flush();
			out.close();

			return f;
		}
		catch (IOException e) 
		{
			throw new KahuuException( e.getMessage( )  );
		}

	}
}
